2

SenecaJS入门

node微服务化


1.1 新建项目

1.2 安装SenecaJS

npm install seneca --save -dev

1.2 安装SenecaJS

初始化并使用 test.js

var seneca = require('seneca')();
    
    // create greeting service
    var pattern = { module: 'demo', action: 'greeting' };
    var action = function (msg, done) {
      done(null, { answer: 'hello, ' + msg.name });
    }
    seneca.add(pattern, action);
    
    // client
    var req = {module: 'demo', action: 'greeting', name:'Marlin'}
    seneca.act( req, function (error, result){
      if ( error )
        console.log(error);
      else
        console.log(result.answer);
});

运行 node test.js

hello, Marlin
{"kind":"notice","notice":"hello seneca ab51h4akkxqi/1495729709903/61561/3.3.0/-","level":"info","when":1495729710090}

1.3 到底发生什么了?

当 seneca.act() 执行时, SenecaJS 会使用 req 去比对服务注册的 pattern,如果 req 中含有 pattern 的全部属性名和值就匹配上了,如果有多个候选按以下顺序挑选:

属性更多的 pattern 胜出

  • req{a:1,b:2} 会从 {a:1}, {a:1, b:2} 中挑中 {a:1, b:2} 注意,{a:1} 也算匹配,如果只有
    {a:1},它就会挑中

  • 相同个数的话按字母序排: req{a:1,b:2,c:3} 会从 {a:1,b:2}, {a:1,c:3}中挑中{a:1,b:3}

  • 相同字母序的话,较晚注册的胜出 seneca.add({a:1,b:2}, f1).add({a:1,b:2}, f2) 的话,总是 f2
    起作用

这样就会找到之前通过 seneca.add() 注册了服务,然后 Seneca 会用收到的消息做为参数去调用 pattern 对应的函数。

2.1 编写服务器

单开一个项目,server.js 内容如下:

var seneca = require('seneca')();

// greeting service
var pattern = { module: 'demo', action: 'greeting' };
var action = function (msg, done) {
  done(null, { answer: 'hello, ' + msg.name });
}
seneca.add(pattern, action);
seneca.listen(7788);

比之前 Hello 那个单进程的例子,就多了最后一行。

2.2 启动服务器

{"kind":"notice","notice":"hello seneca 0mgfudkot8re/1495737576275/64494/3.3.0/-","level":"info","when":1495737576450}

2.3 编写客户端

单开一个项目,client.js 内容如下:

var seneca = require('seneca')();

// client
seneca.client(7788);

var req = { module: 'demo', action: 'greeting', name:'Marlin' }
seneca.act( req, function (error, result){
  if ( error ) 
    console.log(error);
  else 
    console.log(result.answer);
});

比 Hello 例子就多了 seneca.client(7788) 这一行。

2.4 运行客户端

hello, Marlin
{"kind":"notice","notice":"hello seneca wzv6r4jyjiua/1495737582831/64509/3.3.0/-","level":"info","when":1495737583012}

2.5 发生了什么?

seneca.listen(7788) 会在默认主机上用默认协议启动收听请求。服务器启动后,可以用 cURL 命令确认是否工作:

10:02server $ curl -d '{"module":"demo","action":"greeting","name":"Marlin"}' http://localhost:7788/act
{"answer":"hello, Marlin"}

seneca.client(7788) 则告诉 Seneca 服务在默认主机上需要用默认协议通信。

Seneca 自带了 tcp 和 http 传输协议,通过插件模块还能支持更多种。


是最好的语言是
64 声望4 粉丝

我是个前端小菜鸟。我要记录我踩过的各种坑坑。